# Incluyo archivo con funciones utiles
from util import *
import math

# Incluyo modulo de visibilidad
#import visilibity as vis
#from visilibity_test import *

# Incluyo las variables globales que voy a necesitar
from globalVar import GLOBAL_VAR, NUMERO, agentes, FLAG_DEBUGG, VISILIBITY

class Vision(pygame.sprite.Sprite):
    def __init__(self, pos, radius):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((radius*2,radius*2)) # tamanio imagen
        self.image.set_colorkey((0,0,0)) # transparente
        pygame.draw.circle(self.image, (255,0,0), (radius,radius), 50, 2) # red circle
        self.image = self.image.convert_alpha()
        self.rect = self.image.get_rect()
        self.rect.center = pos
        self.radius = radius # para chequear colisiones
        
    def update(self, rect):
        # no need for seconds but the other sprites need it
        self.rect = rect

class Agente(pygame.sprite.Sprite):
    
    def __init__ (self, pos=None, masa=1, size=None, speed=[0,0], rangVision =100,color=None):
        global NUMERO,GLOBAL_VAR, VISILIBITY
        # Inicializo posicion, velocidad, aceleracion y fuerza en (0,0)
        
        if pos == None:
            pos = (0,0)
        self.pos = pos
        self.rangoVision =rangVision
        self.speed = speed
        self.acel = [0,0]
        self.fuerza = [0,0]
        self.heading = math.degrees(math.atan2(self.speed[1], self.speed[0]));
        if ( self.heading < 0):
            self.heading += 360

        # Cargo numero de identificacion del agente
        self.id = NUMERO
        # Genero proximo numero de identificacion
        NUMERO += 1
        # Inicializo la masa del agente igual a 1
        self.masa = masa        
        
        # Inicializo Sprite
        pygame.sprite.Sprite.__init__ (self) 
        if size==None:
            SIZE = 10
            size = (SIZE,SIZE)
        self.size = size

        image = pygame.Surface(size)
        image = image.convert()
        if None == color :
            color = (255,0,0,0)
        image.fill( color )
        self.image = image
        self.rect = image.get_rect()
        self.rect.center = pos
        self.vision = Vision(self.rect.center, self.rangoVision)
        # Recupero la pantalla
        self.screen = pygame.display.get_surface()
            
        # Guardo area de la pantalla
        self.area = self.screen.get_rect()
            
        # Defino una escala para el renderizado
        self.escala = 25
            
            # Situo al agente en la posicion inicial
        #self.rect.centerx, self.rect.centery = self.pos[0], self.pos[1]
    
    # Desc: Recibe dos coordenadas y situa al agente en esas coordenadas
    def situar_en(self, new_pos_x, new_pos_y):
        
        self.rect.centerx, self.rect.centery = new_pos_x, new_pos_y
    def update(self, grupo_pared =None):
        if None == grupo_pared:
            self.rect = self.rect.move(self.speed)
        else:
            self.rect.move_ip(0,self.speed[1])
            if pygame.sprite.spritecollideany(self, grupo_pared):
                self.speed[1] = -self.speed[1]
                self.rect.move_ip(0,self.speed[1] )
            self.rect.move_ip(self.speed[0],0)
            if pygame.sprite.spritecollideany(self, grupo_pared):
                self.speed[0] = -self.speed[0]
                self.rect.move_ip(self.speed[0], 0 )
        
        
        self.vision.update(self.rect)
        
        #self.vision.draw(self.screen)
        # Si el agente salio de la pantalla
        if not self.area.contains(self.rect):
            
            # --- compare self.rect and area.rect
            if self.rect.centerx - self.rect.width/2 > self.area.right:
                self.rect.centerx = self.area.left
                
            if self.rect.centerx + self.rect.width/2 < self.area.left:
                self.rect.centerx = self.area.right
                
            if self.rect.centery - self.rect.height/2 > self.area.bottom:
                self.rect.centery = self.area.top
                
            if self.rect.centery + self.rect.height/2 < self.area.top:
                self.rect.centery = self.area.bottom
                
        
        
    def updateVel(self, f):
        '''Actualiza la velocidad en base a la fuerza f.
        Calcula v_x = v_x + f/masa, v_y = v_y + f/masa'''
        
        self.speed = map((lambda (x, fuerza): x+fuerza/self.masa ), zip(self.speed, f))
        
        
